#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void Handler(int signo)
{
    printf("I get a signal,signalnum : %d\n", signo);
    
    while(true)
    {
        pid_t rid = waitpid(-1,nullptr,WNOHANG);
        if(rid > 0)
        {
            std::cout << "回收子进程成功,child id is :"<<rid<<std::endl;
        }
        else if(rid == 0)
        {
            std::cout << "子进程已经全部回收完成"<<std::endl;
            break;
        }
        else
        {
            std::cout << "wait error"<<std::endl;
            break;
        }

    }

}

int main()
{
    ::signal(SIGCHLD, Handler);

    for(int i = 1; i <= 10;i++)
    {
        if(fork() == 0)
        {
            sleep(5);
            printf("子进程退出,pid: %d\n",getpid());
            exit(0);
        }
    }

    while(true)
    {
        sleep(1);
    }
}

// void Handler(int signo)
// {
//     printf("I get a signal,signalnum : %d\n", signo);
//     pid_t rid;
//     while ((rid = waitpid(rid, nullptr, WNOHANG)) > 0)
//     {
//         printf("Wait child sucess,id %d\n", rid);
//     }
//     printf("child is quit,id : %d", getpid());
// }

// int main()
// {
//     signal(SIGCHLD, Handler);

//     pid_t id = fork();
//     if (id < 0)
//     {
//         perror("fork");
//         exit(2);
//     }
//     else if (id == 0)
//     {
//         printf("I am child process ,pid : %d\n", getpid());
//         sleep(3);
//         exit(1);
//     }
//     else
//     {
//         while (1)
//         {
//             printf("I am father process, I am doing something\n");
//             sleep(1);
//         }
//     }
// }

// volatile int flag = 0;

// void change(int signo)
// {
//     (void)signo;

//     flag = 1;
//     printf("chang flag 0->1,getpid : %d\n",getpid());
// }

// int main()
// {
//     printf("I am main process ,pid is : %d\n",getpid());
//     signal(2,change);

//     while(!flag);//主执行流的flag我们没有做任何修改
//     printf("我是正常退出的！\n");
// }